<?php

/**
 * ECSHOP 财付通插件
 * ============================================================================
 * * 版权所有 2005-2012 上海商派网络科技有限公司，并保留所有权利。
 * 网站地址: http://www.ecshop.com；
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和
 * 使用；不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 * $Author: liubo $
 * $Id: tenpay.php 17217 2011-01-19 06:29:08Z liubo $
 */

if (!defined('IN_ECS'))
{
    die('Hacking attempt');
}

$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/tenpayapp.php';

if (file_exists($payment_lang))
{
    global $_LANG;

    include_once($payment_lang);
	require_once (ROOT_PATH."includes/tenpayapp/WxPayPubHelper/WxPay.pub.config.php");
	require_once (ROOT_PATH."includes/tenpayapp/WxPayPubHelper/SDKRuntimeException.php");
	require_once (ROOT_PATH."includes/tenpayapp/WxPayPubHelper/WxPayPubHelper.php");
	//require_once (ROOT_PATH."includes/tenpayapp/WxPayPubHelper/TenpayHttpClient.class.php");
}

/* 模块的基本信息 */
if (isset($set_modules) && $set_modules == TRUE)
{
    $i = isset($modules) ? count($modules) : 0;

    /* 代码 */
    $modules[$i]['code']    = basename(__FILE__, '.php');

    /* 描述对应的语言项 */
    $modules[$i]['desc']    = 'tenpayapp_desc';

    /* 是否支持货到付款 */
    $modules[$i]['is_cod']  = '0';

    /* 是否支持在线支付 */
    $modules[$i]['is_online']  = '1';

    /* 作者 */
    $modules[$i]['author']  = 'ECSHOP TEAM';

    /* 网址 */
    $modules[$i]['website'] = 'http://www.tenpay.com';

    /* 版本号 */
    $modules[$i]['version'] = '2.0.0';

    /* 配置信息 */
    $modules[$i]['config']  = array(
        array('name' => 'tenpay_account',   'type' => 'text', 'value' => ''),
        array('name' => 'tenpay_key',       'type' => 'text', 'value' => ''),
        array('name' => 'magic_string',     'type' => 'text', 'value' => '')
    );

    return;
}

/**
 * 类
 */
class tenpayapp
{
    /**
     * 构造函数
     *
     * @access  public
     * @param
     *
     * @return void
     */
    /*function tenpay()
    {
    }*/

    function __construct()
    {
        //$this->tenpay();
    }

    /**
     * 生成支付代码
     * @param   array    $order       订单信息
     * @param   array    $payment     支付方式信息
     */
    function get_code($order, $payment){
		//获取提交的商品价格
        $order_price=trim($order['order_amount']);
        //获取提交的商品名称
        $product_name=trim($order['order_sn']);
        //获取提交的订单号
        $log_id    = get_paylog_id($order['order_id'], $pay_type = PAY_ORDER);
        $out_trade_no=$log_id;
		//商品价格（包含运费），以分为单位
        $total_fee= $order_price*100;

		$unifiedOrder = new UnifiedOrder_pub();
		//设置统一支付接口参数
		//设置必填参数
		//appid已填,商户无需重复填写
		//mch_id已填,商户无需重复填写
		//noncestr已填,商户无需重复填写
		//spbill_create_ip已填,商户无需重复填写
		//sign已填,商户无需重复填写
		$unifiedOrder->setParameter('trade_type', 'APP');	            //支付类型
		$unifiedOrder->setParameter('body', $product_name);					//商品描述
		$unifiedOrder->setParameter('fee_type', '1');				//银行币种
		$unifiedOrder->setParameter('notify_url', return_urlv2('tenpayapp'));	    //通知地址
		$unifiedOrder->setParameter('out_trade_no', $out_trade_no);		        //商户订单号
		$unifiedOrder->setParameter('total_fee', $total_fee);			//商品总金额,以分为单位
		$unifiedOrder->setParameter('spbill_create_ip', $_SERVER['REMOTE_ADDR']);  //支付机器IP

		//统一下单
        $prepayid = null;
        $i = 0;
        do{
		    $prepayid = $unifiedOrder->getPrepayId();
            $i++;
        }while( empty($prepayid) && $i <= 2 );

		if (empty($prepayid)) {
			return false;
		}

		//返回数据
		$return['appid'] = WxPayConf_pub::APPID;
		$return['partnerid'] = WxPayConf_pub::MCHID;
		$return['prepayid'] = $prepayid;
		$return['package'] = 'Sign=WXPay';
		$return['noncestr'] = $unifiedOrder->createNoncestr();
		$return['timestamp'] = time();
		$return['sign'] = $unifiedOrder->getSign($return);
		return $return;
    }

    /**
     * 响应操作
     */
    function respond()
    {
        //使用通用通知接口
        $notify = new Notify_pub();
        //存储微信的回调
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];  
        ecshop_write_log('请求数据：'.$xml, 'paynotify'); 
        $notify->saveData($xml);
        //验证签名，并回应微信。
        //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
        //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
        //尽可能提高通知的成功率，但微信不保证通知最终能成功。
        $result = $notify->checkSign();
        if($result == FALSE){
            $notify->setReturnParameter("return_code","FAIL");//返回状态码
            $notify->setReturnParameter("return_msg","签名失败");//返回信息
        }else{
            $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
        }
        if($result == TRUE){
            if ($notify->data["return_code"] == "FAIL") {
                //此处应该更新一下订单状态，商户自行增删操作
                ecshop_write_log($notify->data["out_trade_no"].'：支付失败', 'paynotify'); 
            }elseif($notify->data["result_code"] == "FAIL"){
                //此处应该更新一下订单状态，商户自行增删操作
                ecshop_write_log($notify->data["out_trade_no"].'：支付失败', 'paynotify'); 
            }else{
                //此处应该更新一下订单状态，商户自行增删操作
                ecshop_write_log($notify->data["out_trade_no"].'：支付成功', 'paynotify'); 
                order_paid($notify->data["out_trade_no"], 2);
            }
            //商户自行增加处理流程,
            //例如：更新订单状态
            //例：数据库操作
            //例如：推送支付完成信息
        }
        $returnXml = $notify->returnXml();
        ecshop_write_log('返回数据：'.$returnXml, 'paynotify'); 
        echo $returnXml;exit;
    }
}

?>
